#pragma once

#include <ctime>
#include <string>
#include <mysql/mysql.h>

class connection
{
public:
    connection()
    {
        _conn = mysql_init(nullptr);
    }

    ~connection()
    {
        if (_conn != nullptr)
            mysql_close(_conn);
    }

    // 连接数据库
    bool connect(std::string ip,
                 uint16_t port,
                 std::string user,
                 std::string password,
                 std::string db)
    {
        MYSQL *my = mysql_real_connect(_conn, ip.c_str(), user.c_str(),
                                       password.c_str(), db.c_str(), port, nullptr, 0);
        if (my != nullptr)
        {
            mysql_set_character_set(_conn, "utf8"); // 设置连接的编码
            return true;
        }
        else
            return false;
    }

    // 更新操作 insert、delete、update
    bool update(std::string sql)
    {
        if (mysql_query(_conn, sql.c_str()))
        {
            return false;
        }
        return true;
    }

    // 查询操作 select
    MYSQL_RES *query(std::string sql)
    {
        if (mysql_query(_conn, sql.c_str()) != 0)
        {
            return nullptr;
        }
        return mysql_use_result(_conn);
    }

    // 刷新一下连接的起始的空闲时间点
    void refreshAliveTime()
    {
        _aliveTime = clock(); // clock 函数返回值的单位为毫秒
    }

    // 获取连接已经空闲了多长时间
    clock_t getAliveTime() const
    {
        return clock() - _aliveTime;
    }

private:
    MYSQL *_conn;       // 表示和 MySQL Server 的一条连接
    clock_t _aliveTime; // 记录进入空闲状态后的起始存活时间
};